﻿' BasecampVB - http://www.tidbitsandtangents.com
' Copyright (c) 2009
' by Rusty S. Swayne
'
' Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
' documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
' the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
' to permit persons to whom the Software is furnished to do so, subject to the following conditions:
'
' The above copyright notice and this permission notice shall be included in all copies or substantial portions 
' of the Software.
'
' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
' INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
' DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
' SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
' SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
' WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
' THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Imports TnT.BasecampVB.DAL

Namespace BLL

    Public Class Comment
        Inherits BasecampBase

        ''' <summary>
        ''' Constructor
        ''' </summary>
        Public Sub New( _
            ByVal comment_id As Integer, _
            ByVal commentable_id As Integer, _
            ByVal commentable_type As String, _
            ByVal author_id As Integer, _
            ByVal body As String, _
            ByVal attachments_count As Integer, _
            ByVal emailed_from As String, _
            ByVal created_at As DateTime)

            Me.comment_id = comment_id
            Me.commentable_id = commentable_id
            Me.commentable_type = commentable_type
            Me.author_id = author_id
            Me.body = body
            Me.attachments_count = attachments_count
            Me.emailed_from = emailed_from
            Me.created_at = created_at

        End Sub

        ''' <summary>
        ''' Returns Comment from Basecamp API
        ''' </summary>
        Public Shared Function GetComment(ByVal comment_id As Integer) As Comment
            Return GetCommentFromCommentDetails(BasecampProvider.API.GetComment(comment_id))
        End Function

        ''' <summary>
        ''' Returns a List(Of Comment) from Basecamp API
        ''' </summary>
        Public Shared Function GetComments(ByVal resource As CommentResource, ByVal resource_id As Integer) As List(Of Comment)
            Return GetCommentListFromCommentDetailsCollection(BasecampProvider.API.GetComments(resource.ToString, resource_id))
        End Function

        ''' <summary>
        ''' Creates a comment in Basecamp via Basecamp API
        ''' </summary>
        Public Shared Function CreateComment(ByVal resource As CommentResource, ByVal resource_id As Integer, ByVal body As String) As Integer
            Return BasecampProvider.API.CreateComment(resource.ToString, resource_id, body)
        End Function

        ''' <summary>
        ''' Updates a comment in Basecamp via Basecamp API
        ''' </summary>
        Public Shared Function UpdateComment(ByVal comment_id As Integer, ByVal body As String) As Boolean
            Return BasecampProvider.API.UpdateComment(comment_id, body)
        End Function

        ''' <summary>
        ''' Updates a comment in Basecamp via Basecamp API
        ''' </summary>
        Public Function Update() As Boolean
            Return UpdateComment(Me.comment_id, Me.body)
        End Function

        ''' <summary>
        ''' Deletes a comment in Basecamp via Basecamp API
        ''' </summary>
        Public Shared Function DeleteComment(ByVal comment_id As Integer) As Boolean
            Return BasecampProvider.API.DeleteComment(comment_id)
        End Function

        ''' <summary>
        ''' Deletes a comment in Basecamp via Basecamp API
        ''' </summary>
        Public Function Delete() As Boolean
            Dim ret As Boolean = DeleteComment(Me.comment_id)
            Me.comment_id = 0
            Return ret
        End Function

#Region "Private Utility Methods"

        ''' <summary>
        ''' Helper Function to create a List(Of Comment) from List(Of CommentDetails)
        ''' </summary>
        Private Shared Function GetCommentListFromCommentDetailsCollection(ByVal recordset As List(Of CommentDetails)) As List(Of Comment)
            Dim comments As New List(Of Comment)
            Dim record As CommentDetails = Nothing
            For Each record In recordset
                comments.Add(GetCommentFromCommentDetails(record))
            Next
            Return comments
        End Function

        ''' <summary>
        ''' Helper Function to create a Comment from CommentDetails
        ''' </summary>
        Private Shared Function GetCommentFromCommentDetails(ByVal record As CommentDetails) As Comment
            Return New Comment(record.comment_id, record.commentable_id, record.commentable_type, record.author_id, record.body, _
                            record.attachments_count, record.emailed_from, record.created_at)
        End Function

#End Region

#Region "Properties"

        Private _comment_id As Integer
        Public Property comment_id() As Integer
            Get
                Return _comment_id
            End Get
            Set(ByVal value As Integer)
                _comment_id = value
            End Set
        End Property

        Private _commentable_id As Integer
        Public Property commentable_id() As Integer
            Get
                Return _commentable_id
            End Get
            Set(ByVal value As Integer)
                _commentable_id = value
            End Set
        End Property

        Private _commentable_type As String
        Public Property commentable_type() As String
            Get
                Return _commentable_type
            End Get
            Set(ByVal value As String)
                _commentable_type = value
            End Set
        End Property

        Private _author_id As Integer
        Public Property author_id() As Integer
            Get
                Return _author_id
            End Get
            Set(ByVal value As Integer)
                _author_id = value
            End Set
        End Property

        Private _body As String
        Public Property body() As String
            Get
                Return _body
            End Get
            Set(ByVal value As String)
                _body = value
            End Set
        End Property


        Private _attachments_count As Integer
        Public Property attachments_count() As Integer
            Get
                Return _attachments_count
            End Get
            Set(ByVal value As Integer)
                _attachments_count = value
            End Set
        End Property


        Private _emailed_from As String
        Public Property emailed_from() As String
            Get
                Return _emailed_from
            End Get
            Set(ByVal value As String)
                _emailed_from = value
            End Set
        End Property

        Private _created_at As String
        Public Property created_at() As String
            Get
                Return _created_at
            End Get
            Set(ByVal value As String)
                _created_at = value
            End Set
        End Property


#End Region

    End Class

End Namespace